Problem
【SCOI2008】斜堆
Description
斜堆是一种常用的数据结构。它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大。因此在整棵斜堆中,根的值最小。但斜堆不必是平衡的,每个结点的左右儿子的大小关系也没有任何规定。在本题中,斜堆中各个元素的值均不相同。
在斜堆中插入新元素的过程是递归进行的:
- 当为空或者小于的根结点时X变为新的树根,而原来的树根(如果有的话)变为的左儿子。
- 当大于的根结点时,根结点的两棵子树交换,而(递归)插入到交换后的左子树中。
给出一棵斜堆,包含值为的结点各一次。求一个结点序列,使得该斜堆可以通过在空树中依次插入这些结点得到。
如果答案不惟一,输出字典序最小的解。输入保证有解。
Input
第一行包含一个整数。
第二行包含个整数,表示是的左儿子,表示是的右儿子。
显然总是根,所以输入中不含。
Output
Sample Input
1 | 6 |
Sample Output
1 | 0 1 2 3 4 5 |
标签:可并堆
斜堆
Solution
探究斜堆性质的好题,可以围观的题解。
考虑每次找到最后插入的结点,删除并维护到插入前的状态。那么我们需要探究一些斜堆的性质。
- 最后插入的结点一定是一个极左结点,即从根到它的路径都是向左走,因为最后插入后没有再交换过子树。
- 最后插入的结点一定没有右子树。易发现所有右子树都是因为插入结点而从左结点交换而来,而最后插入的结点的子树中一定不会插入新的结点,故一定不会有右子树。
- 最后插入结点时,其到根的结点一定会交换左右子树,因此这个结点到根的路径上的所有结点一定都有左右子树。
综上,最后插入的结点一定是从根结点一直向左走遇到的第一个无右子树的结点。特别地,如果此结点的左子结点是叶子,那么两者均可选,这时应该先选叶子结点以使字典序最小。模拟次即可
Code
1 |
|